/* Copyright (c) 2004-2023 Peigen.info. All rights reserved. */
package info.peigen.hotpot.manage.core.util;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.SaTokenException;
import cn.hutool.http.HttpStatus;
import info.peigen.hotpot.common.core.result.ResultBase;
import info.peigen.hotpot.common.core.result.ResultStatus;
import lombok.extern.slf4j.Slf4j;

/**
 * <b>(AuthExceptionUtil)</b>
 *
 * @author Peigen
 * @version 1.0.0
 * @since 2024/7/11
 */
@Slf4j
public class AuthExceptionUtil {
    /**
     * 根据错误类型获取对应的CommonResult（只处理SaToken相关异常）
     *
     * @author xuyuxiang
     * @date 2021/10/11 15:52
     **/
    public static ResultBase getCommonResult(Exception e) {
        ResultBase result;
        if (e instanceof NotLoginException notLoginException) {

            // 如果是未登录异常 401
            result = ResultBase.builder()
                    .status(ResultStatus.failure)
                    .code(String.valueOf(HttpStatus.HTTP_UNAUTHORIZED))
                    .detail(notLoginException.getMessage())
                    .build();
        } else if (e instanceof NotRoleException notRoleException) {

            // 如果是角色异常 403
            result = ResultBase.builder()
                    .status(ResultStatus.failure)
                    .code(String.valueOf(HttpStatus.HTTP_FORBIDDEN))
                    .detail("无此角色：" + notRoleException.getRole() +
                            "，接口地址：" + ServletUtil.getRequest().path())
                    .build();
        } else if (e instanceof NotPermissionException notPermissionException) {

            // 如果是权限异常 403
            result = ResultBase.builder()
                    .status(ResultStatus.failure)
                    .code(String.valueOf(HttpStatus.HTTP_FORBIDDEN))
                    .detail("无此权限：" + notPermissionException.getPermission())
                    .build();
        } else if (e instanceof SaTokenException saTokenException) {

            // 如果是SaToken异常 直接返回
            result = ResultBase.builder()
                    .status(ResultStatus.failure)
                    .code(ResultStatus.failure.code())
                    .detail(saTokenException.getMessage())
                    .build();
        } else {
            // 未知异常才打印
            log.error(">>> 服务器未知异常，请求地址：{}，具体信息：", ServletUtil.getRequest().url(), e);
            // 未知异常返回服务器异常（此处不可能执行进入，因为本方法处理的一定是SaToken的异常，此处仅为安全性考虑）
            result = ResultBase.builder()
                    .status(ResultStatus.failure)
                    .code(ResultStatus.failure.code())
                    .detail("服务器异常" + e.getMessage())
                    .build();
        }
        return result;
    }

}
